<?php
date_default_timezone_set('UTC');
/*
 * 阿里云域名注册
 * 调用CheckDomain接口时有频率限制，单用户限制为10QPS，接口总量限制为100QPS
 * */
class Aliyundomain
{   
    /*
     * 公共的请求参数
     * */
    protected $commond = [];

    /*
     * 请求地址
     * */
    protected $Avail = [
        '1'=>'可注册',
        '3'=>'预登记',
        '4'=>'可删除预订',
        '0'=>'不可注册',
        '-1'=>'异常',
        '-2'=>'暂停注册',
        '-3'=>'黑名单',
    ];

    /*
     * 请求地址
     * */
    protected $url = 'http://domain.aliyuncs.com';

    /*
     * AccessKey
     * */
    protected  $AccessKey;

    /*
     * AccessKey Secret
     * */
    protected  $Secret;


    /*
     * 初始化Signature参数
     * $AccessKey   string  AccessKey
     * $Secret      string  Secret
     * */
    public function __construct($AccessKey = '',$Secret = '')
    {
        $this->AccessKey = $AccessKey ? $AccessKey :'LTAI4G1wPtEZMnU3ekjFgdYn';
        $this->Secret = $Secret ? $Secret : 'E9nrp3a5vZpLVQnKrx6RnnzOMRlIrV';
        $this->common = [
            // 定义数据返回格式
            'Format'=>'json',
            // 版本号
            'Version'=>'2018-01-29',
            // 密钥ID
            'AccessKeyId'=>'',
            // 签名结果串
            'Signature'=>'',
            // 签名方式
            'SignatureMethod'=>'HMAC-SHA1',
            // 请求时间戳
            'Timestamp'=>gmdate("Y-m-d\TH:i:s\Z"),
            // 签名算法版本，目前版本是1.0
            'SignatureVersion'=>'1.0',
            // 唯一随机数
            'SignatureNonce'=>md5(rand(0,99999).uniqid().microtime()),
        ];
    }

    /*
     * 生成签名
     * */
    public function CreateSign($arr = [])
    {   
        if (!is_array($arr)) return ['code'=>0,'data'=>[],'msg'=>'生成签名参数有误'];
        $arr = array_merge($arr,$this->common);
        $arr['AccessKeyId'] = $this->AccessKey;
        if (isset($arr['Signature'])) {
            unset($arr['Signature']);
        }
        /*
         * 排序规则以首字母顺序排序，排序参数包括公共请求参数和接口自定义参数，不包括公共请求参数中的Signature参数
         * */
        ksort($arr);

        // 参数拼接
        $query  = '';
        foreach ($arr as $k=>&$value){
            $query.= $this->percentEncode($k).'='.$this->percentEncode($value).'&';
        }
        // 转码
        $param = 'GET&%2F&'.$this->percentEncode( rtrim($query,'&') );
        // 签名
        $sign = base64_encode(hash_hmac('sha1', $param, $this->Secret.'&', true));
        // 赋值
        $arr['Signature'] = $sign;
        return $arr;
    }

    protected  function percentEncode($string)
    {
        $result = urlencode($string);
        $result = str_replace(['+', '*'], ['%20', '%2A'], $result);
        $result = preg_replace('/%7E/', '~', $result);

        return $result;
    }

    /*
     * 检查域名是否可以注册
     * $param   array  请求参数
     * return   array
     * */
    public function CheckDomain($param)
    {
        $query = http_build_query($param);
        $url = $this->url.'?'.$query;
        $result = $this->Sendurl($url);
        $data = json_decode($result,true);
        if ($data['Avail']!==1) {
            return ['code'=>0,'data'=>$data,'msg'=>$this->Avail[$data['Avail']]];
        }
        return  ['code'=>1,'data'=>$data,'msg'=>'success'];
    }

    /*
     * 发起域名注册
     * $param   array  请求参数
     * return   array
     * */
    public function CreateRegisterDomain($param)
    {
        $query = http_build_query($param);
        $url = $this->url.'?'.$query;
        $result = $this->Sendurl($url);
        $data = json_decode($result,true);
        if (!isset($data['TaskNo'])) {
            return ['code'=>0,'data'=>[],'msg'=>$this->Avail[$data['Avail']]];
        }
        return  ['code'=>1,'data'=>$data,'msg'=>'success'];
    }

    /*
     * QueryTaskDetailList
     * $param   array  请求参数
     * return   array
     * */
    public function QueryTaskDetailList($param)
    {
        $query = http_build_query($param);
        $url = $this->url.'?'.$query;
        $result = $this->Sendurl($url);
        $data = json_decode($result,true);
        var_dump($data);die;
        if (!isset($data['TaskNo'])) {
            return ['code'=>0,'data'=>[],'msg'=>$this->Avail[$data['Avail']]];
        }
        return  ['code'=>1,'data'=>$data,'msg'=>'success'];
    }
    
    /*
     * 定义请求
     * $method      string  请求方式|1:get  2:post
     * $is_http     string  协议类型|1:http 2:https
     * $url         string  请求地址
     * return       string|bool
     * */
    protected function Sendurl($url,$method='1',$is_http='1',$header=[],$data=[])
    {
        // 初始化curl模块
        $curl    = curl_init();
        // 登录地址
        curl_setopt($curl, CURLOPT_URL, $url);
        // 是否显示头信息
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回，而不是直接输出。
        // 设置header头部信息
        curl_setopt($curl, CURLOPT_HTTPHEADER,$header);

        if ($is_http=='2'){
            // 忽略cURL验证SSL证书
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, false);
            // 忽略主机验证
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, false);
        }

        if ($method=='2'){
            // post提交方式
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
        }
        //执行
        $contents = curl_exec($curl);
        //关闭cURL资源，并且释放系统资源
        curl_close($curl);
        return $contents;
    }
}


$obj = new Aliyundomain('','');
/*
 * 域名检测业务参数
 * */
$param = [
    'Action'=>'CheckDomain',
    'DomainName'=>'szk0817.com',
];
$arr = $obj->CreateSign($param);
$result = $obj->CheckDomain($arr);
var_dump($result);
####################################################################################################
// 现阶段演示域名注册不按照认证模板进行请求，费事情还麻烦
// $param = [
//     'Action'=>'SaveSingleTaskForCreatingOrderActivate',
//     'DomainName'=>'szk0817.com',
//     // 认证模板不填 
//     'RegistrantProfileId'=>'',
//     // 1：个人  2：企业、组织等
//     'RegistrantType'=>1,
//     // 域名的持有人姓名(中文)
//     'ZhRegistrantOrganization'=>'张三',
//     // 域名联系人（中文）
//     'ZhRegistrantName'=>'张三',
//     // 省份
//     'ZhProvince'=>'安徽',
//     // 城市（中文）
//     'ZhCity'=>'合肥',
//     // 地址
//     'ZhAddress'=>'科学大道',
//     // 持有者的名字(英文)
//     'RegistrantOrganization'=>'bob',
//     // 域名联系人（英文）
//     'RegistrantName'=>'bob',
//     'Province'=>'anhui',
//     'City'=>'hefei shi',
//     'Address'=>'No.100,science main street',
//     // 邮编
//     'PostalCode'=>'11232',
//     // 国家代码
//     'Country'=>'CN',
//     // 电话国家代码
//     'TelArea'=>'86',
//     // 联系电话
//     'Telephone'=>'13344556677',
//     // 分机号
//     'TelExt'=>'02180181111',
//     'Email'=>'123@qq.com',
// ];
// $arr = $obj->CreateSign($param);
// // 返回请求标识跟任务编号
// $result = $obj->CreateRegisterDomain($arr);
// var_dump($result);
// $TaskNo = $result['data']['TaskNo'];
// $TaskNo = '45e87c34-1390-44ca-b21a-6e53eb51f3da';
// 根据任务编号查询域名注册
// $param = [
//     'Action'=>'QueryTaskDetailList',
//     'PageNum'=>'1',
//     'PageSize'=>'10',
//     'TaskNo'=>$TaskNo,
// ];
// $arr = $obj->CreateSign($param);
// $result = $obj->QueryTaskDetailList($arr);

// 下面是返回值
// array(8) {
// ["PrePage"]=>
// bool(false)
// ["CurrentPageNum"]=>
// int(1)
// ["PageSize"]=>
// int(10)
// ["RequestId"]=>
// string(36) "B830B098-DEAC-5C80-B2D9-ADCD02927B82"
// ["TotalPageNum"]=>
// int(1)
// ["Data"]=>
// array(1) {
// ["TaskDetail"]=>
// array(1) {
// [0]=>
// array(11) {
// ["TryCount"]=>
// int(5)
// ["TaskNo"]=>
// string(36) "45e87c34-1390-44ca-b21a-6e53eb51f3da"
// ["DomainName"]=>
// string(11) "szk0817.com"
// ["TaskStatusCode"]=>
// int(3)
// ["TaskType"]=>
// string(14) "ORDER_ACTIVATE"
// ["CreateTime"]=>
// string(19) "2022-03-11 23:00:28"
// ["UpdateTime"]=>
// string(19) "2022-03-11 23:00:28"
// ["ErrorMsg"]=>
// string(48) "The specified registrant information is invalid."
// ["TaskStatus"]=>
// string(15) "EXECUTE_FAILURE"
// ["TaskTypeDescription"]=>
// string(8) "Register"
// ["TaskDetailNo"]=>
// string(32) "d431b0cf0905479d9ead0154bbd334c0"
// }
// }
// }
// ["TotalItemNum"]=>
// int(1)
// ["NextPage"]=>
// bool(false)
// }